This file contains the change history and any other comments that help developers upgrade to the latest version of ASLM. Please see the Release Notes file for more information on ASLM 2.0.
All changes that only affect the PowerPC version of ASLM are preceded with "PowerPC:" and all changes that only affect the 68K version of ASLM are preceded with "68K:".
If you only want to see changes and bug fixes since ASLM 1.1.2, then please see the ASLM 2.0 Supplement instead.
If you have any questions please AppleLink Gary Hornbuckle, the Apple Shared Library Manager Product Marketing Manager, at HORNBUCKLE1. Technical questions and bug reports should be sent to DEVSUPPORT. Please cc: HORNBUCKLE1 in this case.
============================
Changes for 2.0.1- 8/13/96
Got rid of warnings for unused variables and parameters from MrC and SC while building shared libraries.
PowerPC: Fixed an incompatbility with LibraryBuilderPPC and PPCLink 1.4. Sometimes LibraryBuilderPPC would get confused while reading in xcoff file.
Allow UnloadUnusedLibraries to be called recursively. The only caveat is that any recursive calls will not caused unused libraries to be unloaded. However, they are guaranteed to unload before anyone else gets system task time.
PowerPC: Fixed a bug that caused the TInterruptScheduler and TDeferredTaskScheduler to memory out of the current heap rather then the system heap. This could cause a crash if an application created one of these schedulers and didn't destroy it before quitting (you may want to do this when creating a scheduler for global/shared use.
Fixed a bug in TDeferredTaskScheduler that cause it not to fail gracefully if there is not enough memory to allocate some private data. Now it properly calls SetSchedulerDead and will not crash.
Fixed logfile support for function sets that export contructors and destructors.
Fixed the Installer so it no longer clears the bundle bit of the System file.
When MPW switched from supporting C and CFront to only supporing SC and SCpp (and getting rid of the MPW SCLibraries folder in the process) a couple of things broke for ASLM clients built using Symantec tools. A link error would occur because the _dodtors routine was not found and static objects would not be properly constructed. These problems are fixed with the latest LibraryManager.o file in the ASLM SCLibraries folder. Note that if you are using an older MPW then you should continue to use LibraryManager.o from ASLM 2.0.
Fixed a bug that could possibly cause a shared library to fail to load if the resErr low memory global was not set to noErr when ASLM attemped to load the shared library.
PowerPC: No longer load the PowerPC ASLM on Performa 52xx, 53xx, 62xx, and 63xx CPUs with a bad L2 cache.
68k: Added FlushCache to LibraryManagerClient.o so you won't get a link error unless you write your own version of FlushCache.
Fixed a problem with LoadLibraries so it will now always allocate memory out of the calling client's pool, not the current client's pool. This prevents potential crashes when shared libraries start to unload or clients call CleanupLibraryManager.
Fixed up support for ASLM clients written from CodeWarrior. See the CodeWarrior Read Me! document for more information.
LibraryBuilder will genereate CodeWarrior compatible mangled names.
LibraryManager.h now recognizes that CodeWarrior supports SingleObject.
The Inspector example will now build as a client in CodeWarrior.
============================
Changes for 2.0bf3- 5/7/95
PowerPC: Fixed a bug in TTaskSchuduler::Scheduler() that caused a crash if it was used at interrupt time.
============================
Changes for 2.0bf2- 5/5/95
Make the ASLM trap patching routines always flush the cache properly. This affects both application code (ASLM patches the _ExitToShell trap when InitLibraryManager is called) and the Shared Library Manager extensions. The lack of cache flushing only caused problems under obscure conditions on an unreleased cpu.
============================
Changes for 2.0bf1- 4/27/95
68k: Fixed the makefiles for the CPlusSample and CCPlusSample examples so they now properly pass the -cfront option to BuildSharedLibrary.
PowerPC: Fixed the makefile for the TestLibraryPPC example so it now compiles TestLibrarySymbols.cp with -sym on,alltypes rather then with -sym on.
68k: Changed LibraryBuilder so it will give the proper error message if you build with CFront but don't pass -cfront to BuildSharedLibrary.
Changed LibraryBuilder so it will delete the .ia.o temp file if one exists but the .init.a temp file no longer does. This situation can happen if you have a shared library that used to export one or more classes but no longer does. A link error would usually occur if the .ia.o file was linked in.
============================
Changes for 2.0b14 - 4/18/95
Fixed some problems with memory not being freed if a shared library failed to load while running under SingleFinder.
============================
Changes for 2.0b13 - 4/5/95
Fixed a bug that prevent LibraryManagerClient.o from being imported in linked into THINK projects.
Fixed some problems with the TScheduler subclasses causing crashes with VM turned on. This normally only happend if the A5 world of the current application had been paged out when the TTimeScheduler fired and started processing operations.
PowrPC: StaticObjectSupportPPC.o no longer exists. Its only purpose was to prevent all of the IOStreams code in MrCPlusLib from being linked in. This way only static object users got stuck with it. However, the IOStreams code is now split off from MrCPlusLib.o into MrCIOStreams.o so this is no longer an issue.
PowerPC: Fixed a small memory leak introduced in 2.0b12.
68k: Resources in library files that have the preload attribute set are no longer preloaded when opening up the library file under Single Finder. Single Finder provides very little extra System heap space and the System heap will not grow. Allowing preloaded resource to load was causing most, if not all, of the System heap memory to be used up.
Fixed a bug with the DumpPool and DumpRawPool DCMDs no longer displaying class ids. This bug was introduced with 2.0b6.
Fixed a bug in ResetFunctionSet() that caused it not to work properly if you passed in a function set id that had a version number at the end of it.
Added TScheduler::IsSchedulerClientValid(), GetSchedulerClient(), and SetSchedulerClient(). With the 68k version of ASLM, these fields actually act on the GlobalWorld saved with the TScheduler since their is no field for the saved client as there is for the PowrePC verson of ASLM. This means that GetSchedulerClient() will return the client that owns the GlobalWorld saved with the scheduler and SetSchedulerClient() will set the saved GlobalWorld to the global world belonging to the client passed to it.
Added TOperation::GetSavedClient(), and SetSavedClient(). As with the new TScheduler routines by the same name, when using the 68k version of ASLM, these methods actually act on the GlobalWorld saved with the TOperation since only the PowerPC version has the saved client field.
PowerPC: A number of changes have been made to get rid of some of ASLM's requirements that on the A5 world for PowerPC clients. Applications still need to have a minimal A5 world and ASLM still uses CurrentA5, however the A5 world is no longer used or setup for TNotifiers, TOperations, and TSchedulers. The changes listed below are all related to this. It is also recommended that PowerPC users no longer use global world routines like OpenGlobalWorld() and SetCurrentGlobalWorld(). They usually will serve no purpose and will no longer have the desired affect when creating TOperations and TNotifiers. Instead, you should set the current client to the client that you want to be saved along with the TOperation or TNotifier. 68k users should still continue to set the global world before creating TOperations and TNotifiers if they want a certain current global world saved along with the TOperation or TNotifier.
PowerPC: The TNotifier constructor has been changed so that it saves the current client at the time that the notifier was constructed instead of saving the current global world.
PowerPC: The TNofier::Notify() method will now only restore the client. It will not restore the global world.
PowerPC: The TScheduler constructor has been changed so that it saves the current client at the time that the scheduler was constructed instead of saving the current global world.
PowrPC: TScheduler::IsSchedulerWorldValid, GetSchedulerWorld, and SetSchedulerWorld are no longer available. Use the new client routines instead.
PowerPC: The TOperation constructor has been changed so that it saves the current client at the time that the operation was constructed instead of saving the current global world.
PowerPC: TOperation::GetSchedulerWorld, and SetSchedulerWorld are no longer available. Use the new client routines instead.
PowerPC: SetClientToWorld no longer exists.
68k: Added GetClientFromWorld(). It returns the TLibraryManager* the owns the GlobalWorld passed as a parameter.
============================
Changes for 2.0b12 - 3/16/95
68k: Fixes a bug in the ShutDownActionAtom that could cause the Installer to crash older machines running System 6.0.5.
Added FragmentIsNonApplicationASLMClient() routine. If you have a PowerPC code fragment that is not the application's main fragment, then you need to call this routine before calling InitLibraryManager().
Added UnloadUnusedLibaries() routine. It forces any libraries the are currently scheduled to be unloaded (because they are no longer being used) to be unloaded immediately rather then letting ASLM wait up to 1 second before unloading them. This routine is rarely needed, but may be necessary if you have complex library dependencies and are having trouble getting your libraries to unload.
PowerPC: PPCC is no longer supported. You must convert to MrC and MrCpp at this time.
PowerPC: Fixed a bug with the constructor and destructor stub code not being interrupt safe with regard to updating usecounts for shared libraries. This could cause shared libraries to either prematurely unload or to never unload if interrupt code constructed or destructed instances of classes in the shared library.
If extensions are disabled at boot time, ASLM will no longer load later on when an application calls InitLibraryManager.
68k: Fixed a bug introduced in 2.0b4 that caused libraries that were suppose to load into the Process Manager heap to instead end up in the System heap even though memory was preallocated for them in the Process Manager heap. This bug only turned up on 68040 and 68LC040 cpus.
68k: The examples have been converted to use version 8.0.1 of the Symantec MPW compilers instead of 7.0.x. This just involved making a few changes to the SC and SCpp options used in the makefiles.
Added a new operator to LibraryManagerPPC.o and LibraryManager.o that takes an unsigned long parameter instead of an unsigned int. It keeps Metrowerks users happy since it uses unsigned long for the new operator's parameter type. This allows Metrowerks users to use the ASLM new and delete operators if they wish.
============================
Changes for 2.0b10 and 2.0b11 - 3/1/95
ResetFunctionSet will now also work with class methods if you pass it a class ID. It used to ignore class methods and only clear cached addresses for function sets. This also means that if you pass it NULL for the class id, all cached class method addresses will also be cleared, rather than just all cached function set addresses.
Fixed a problem with ASLM sometimes getting in a Restart loop on the PowerPC. The machine would keep on rebooting until ASLM was disabled.
Fixed a problem with ASLM sometimes unloading while preloaded shared libraries are being loaded.
============================
Changes for 2.0b9 - 2/20/95
68k: Fixed a bug in the non-debug version of ASLM that caused certain libraries to not unload properly, either causing a memory leak or a crash. This bug was introduced with 2.0b6.
============================
Changes for 2.0b8 - 2/15/95
Fixed a bug that caused shared libraries loaded at init time to be loaded into the init's temporary application heap by default. This bug was introduced in 2.0b6.
Fixed a bug that would cause ASLM to reboot the machine more than one time if the shift key was held down and the right circumstances existed.
============================
Changes for 2.0b7 - 2/9/95
PowerPC: Fixed a bug in PowerPC version of TStandardPool::Reallocate() that caused it to corrupt the memory under certain situations. This bug was also causing TArray's to sometimes become corrupted when they grew from a smaller size (less thatn 100 bytes) to a size larger then 100 bytes.
Fixed a problem with the LibraryBuilder tool that caused it to crash in version 2.0b6.
BuildSharedLibrary now assumes that you are using the Symantec tools when building a 68k shared library and MrC when building a PowerPC shared library. If you are using CFront or PPCC then you will need to pass the -cfront or -ppcc options to BuildSharedLibrary.
BuildSharedLibrary and LinkSharedLibrary now assume that you are using PPCLink 1.2 or later and you no longer need to do anything special to get PPCLink 1.2 to work with ASLM. If you are using an older version of PPCLink then you will need to pass the -oldPPCLink option to BuildSharedLibrary and LinkSharedLibrary.
============================
Changes for 2.0b6 - 1/30/95
68k: The 68k version of ASLM is now built with SCpp instead of CFront. It is still compatible with clients and shared librireas built using CFront, including those built with earlier versions of ASLM.
68k: Since the built-in ASLM classes are now compiled using SCpp, SCpp clients and shared libraries can safely subclass them and also use them as stack objects and data members. Previously SCpp users could only create instances of the ASLM classes by using the new operator or NewObject() since the clases were compiled using CFront. This still holds true for any class provided by a 3rd party vendor that was compiled using CFront.
PowerPC: The ASLM Installer now installs the MrC version of ASLM instead of the PPCC version. If you are still developing using PPCC, after running the installer you will need to drag install the Shared Library Manager PPC file located in the "PPPC Runtime Support" folder which is located in the "ASLM Developer Tools" folder. Note that PPCC support will be dropped before ASLM 2.0 ships. Support for PPCC is provided in this build to give you time to convert to MrC.
The libraries in the Libraries folder that used to support CFront and PPCC have been moved to subfolders called CFrontLibraries and PPCCLibraries. The PPCCLibraries folder will be removed before ASLM 2.0 ships (since ASLM 2.0 will not ship with PPCC support), but the CFrontLibraries folder will remain and ASLM will continue to support CFront users.
PowerPC: Both the 68k and PowerPC versions of ASLM now share the same variable for keeping track of the current nesting level of EnterInterrupt() calls. This allows an interrupt serviced by one ISA to call EnterInterrupt() and then make a mixed mode code to the other ISA at which time ASLM could be used without having to call EnterInterrupt first. The variable used for determing if InInterruptScheduler() should return true is also shared.
68k: Made changes to the TMethodNotifier class so it can support being created by and both CFront and SCpp clients and can also call a CFront or SCpp method.
PowerPC: Fixed a bug in LibraryManagerPPC that would make it give an "Unknown error reading object file <xxxx>" and then quit. This problem ocurred very rarely and only with certain input object files.
Under System 7 and later, ASLM will now no longer stay loaded at boot time unless there is a preloaded shared library that stays loaded. This is a feature that used to be in ASLM 1.1 but was removed before it was released. When an application calls InitLibraryManager(), ASLM will be loaded and will stay loaded until the next reboot. If an Extension tries to call InitLibraryManager(), ASLM will set a flag in it's preference file that will cause ASLM to stay loaded the next time the machine is restarted. After setting the flag the machine is immediately restarted so ASLM can be made available for the Extension. Once the "stay loaded" flag is set in the ASLM Preferences file, ASLM will always stay loaded so there will be no more machine restarts.
PowerPC: Fixed a bug that would cause a crash if -useLibraryID was passed to BuildSharedLibrary and only a re-link of the shared library was necessary.
PowerPC: Fixed a bug in TDoubleLong::RShift that only occured on the PowerPC version of ASLM.
68k: The SymobolConverter tool's -Symantec2MPW options was changed to -Symantec2CFront.
68k: Fixed a crash that could occur (rarely) while calling the destructor of an SCpp stack object.
68k: SCpp clients can now have static instances of ASLM classes.
============================
Changes for 2.0b5 - 11/17/94
••••••••••••••••••
Support for SCpp is much improved and is now officially supported. See changes and bug fixes below and also see the "Symantec Products and the ASLM" document for more information.
The "ASLM Symantec Support" folder no longer exists. The libraries that clients and shared libraries need to link with are now located in "ASLM Developer Tools:Libraries:SCLibraries:" for SCpp users and "ASLM Developer Tools:Libraries:THINKLibraries:" for THINK users. The SymbolConverter tool is now in the "ASLM Developer Tools:Tools:" folder.
The SCLibraryManager.o file has been renamed to LibraryManager.o.
Problems with some incorrect mangled names in the Symantec version of LibraryManager.o have been fixed. However, the SymbolConverter tool will still generate some incorrect names for certain mangled names when used on your own client object files.
Made TClassID::operator==() and the TMatchObject constructor as _CDECL. Otherwise the wrong calling conventions are used for Symantec clients.
You need to pass -SCpp to BuildSharedLibrary to build a shared library out of code compiled by SCpp.
Fixed a stack handling problem with pascal destructors (ones without _cdecl).
Added the -cfrontCompatible option to BuildSharedLibrary. It allows you to build SCpp shared libraries that can be used by CFront clients. It does this be adding constructor stubs to the shared library that will allocate memory for the object if no memory is being passed in (which is the case when a CFront client creates an instance of a class in an SCpp library and uses the default new operator). The penalty for using this option is 3 extra instructions being executed, even if memory is passed into the constructor.
Declared TCollection::Member() and Remove() methods in a way that creates comptible vtables for both CFront and SCpp. CFront groups methods of the same name so they were not appearing in the vtable in the order that there were declared. However, SCpp always puts them in the order they are declared. They are now declared in the order that CFront has always been putting them anyway.
Fixed a bug that caused DummyVirtualFunction() to always be exported from classes that use the ASLM_SCDECLARATION macro. This caused an extra entry at the beginning of the class's export table which would make the class no longer be compatible with older versions if you switch from building it with SCpp to CFront or vice-versa.
••••••••••••••••••
••••••••••••••••••
ASLM now supports MrC (C and C++). PPCC support will be dropped before ASLM 2.0 ships and only MrC will be supported. This is because MrCpp and PPCC use different vtable formats and both cannot be supported at the same time.
If you want to use MrC, you will need to remove the Shared Library Manger PPC file that the installer installs, and drag in the Shared Library Manager PPC file from the "ASLM Developer Tools:MrC Runtime Support:" folder.
You need to link with the LibraryManager.o file in the "ASLM Developer Tools:MrC Libraries:" folder if you are building with MrC.
You need to pass -mrc to BuildSharedLibrary if you want to build a shared library from MrC generated code. This will be the default before ASLM 2.0 ships, but currently -ppcc is the default.
Many of the rules that apply to SCpp also apply to MrC. This includes the need for all exported classes to contain the DummyVirtualFunction method as the first method in the vtable since MrC (like SCpp) does not leave the empty space at the beginning of the vtable that ASLM requires.
•••••••••••••••••••
Fixed a bug that caused information about "fake" function set parents (the ones created when you use interfaceID= in a function set) to be lost if there were two or more function sets which had the same interfaceID and one of the function sets was removed (obviously this implies that the libraries containing the function sets were in separate library files. The most common symptom of this bug would be having GetFunctionSetInfo() return kNotFound for the parent function set ID.
68k: Model far versions of __vec_new and __vec_delete are now included in the LibraryManager.o file. This solves the problem of shared libraries having to setup their A5 world before constructing an array of objects. The support exists for both CFront and SCpp.
68k: Fixed a stack handling problems with pascal destructors.
68k: Added a workaround to a resource manager bug that only occurs on the 660av and 840av when there are no fonts in the fonts folder. It was causing ASLM to not load.
LinkSharedLibrary will now make sure {TempDir} is always a full path name, even if {TempFolder} and {CPlusScratch} are not set.
LinkSharedLibrary will now always delete the temp files it is about to use first in case they contain leftover stuff from another shared library build.
Fixed a bug in CompareFileSpecs() that caused it to not compare the last 2 bytes of the dirID field. This could cause 2 library files with the same name and on the same volume to compare the same even though they are in different directories. This would happen if the upper 2 bytes of the dirID for both files were the same. This bug had the side affect of causing about one out of every 40 library files installed by the Installer that were also replacing older library files to not be registered with ASLM after rebooting for the first time. This had to do with the fact that the Installer Cleanup code would delete the old library file once the Finder started up and ASLM would think it was deleting the library file in the Extensions folder if both the old and the new file had the same hash value (which they would about 1 in 40 times). After rebooting a second time everything would be ok.
LibraryManager.h no longer #defines OLDROUTINENAMES. It never should have.
All of the examples have been changed to no longer rely on OLDROUTINENAMES being defined.
BuildSharedLibrary will now make sure it always uses a full path name for the batch file in case another file with the same name already exists in the {Commands} path, possibly because of a previously failed BuildSharedLibrary.
Fixed a problem with LibraryBuilder giving a bogus warning if it encountered a "#if <AnyNumericValue>" soon after a section that started with "#ifdef __cplusplus". It would incorrectly warn you that it found a "#if __cplusplus" when it found the "#if <AnyNumericValue>".
68k: The newer ASM assembler puts the mod date of the assembled file into the object file which messes up LibraryBuilder when it tries to compare a newly created client object file with an older one. The newer one would always turn up as being different so it would always replace the older one. The mod date of the <LibraryName>.stubs.a file is now always set to the same time before it is assembled so the same time stamp will appear in every client object file.
68k: In LinkSharedLibrary, the %Complex segment was not being merged properly. It is now.
The ASLM Installer will now install the EtherTalk Phase 2 extension if it is not already present. This is to fix an incompatibility between ASLM and the version of EtherTalk that is in ROM on some cpu's.
The CATCH_ALL marco in LibraryManager.h was broken (for a few builds) when used by C code. It will now once again compile when using C.
68k: Fixed a problem with LeaveCodeResource() accessing globals even after CleanupLibraryManager has been called. This usually is only a problem if you are using the ZAP DCMD.
TFunctionSetInfo is now typedef'd to TClassInfo rather than just doing a forward class declaration that never gets defined.
Fixed the mask for the Shared Library Manager icon. It had a slight glitch in the bottom row of pixels.
68k: Fixed a problem with the MPW Libraries support that turned up if you tried using fopen() and some other i/o related routines.
68k: Fixed a problem with the MPW Libraries support that caused some of the libraries in the MPW Libraries file to never unload once they had been used. You are now required to call CleanupMPWLibraries() (defined in MPWSharedLibs.h) before calling CleanupLibraryManager() if you want to make sure that all the libraries unload.
Fixed a problem with the LibraryBuilder tool generating 4 characters of garbage in front of temporary file names if {TempFolder} and {CPlusScratch} were not set and the -y option was not used.
The Inspector, TestTools, and ExampleLibrary examples can now all build with either PPCC, MrC, CFront, or SCpp. There is a separate makefile for each compiler type.
68k: Added DummyVirtualFunction() implementations to the Symantec version of LibraryManager.o for all base classes (TDynamic, TStdDynamic, TSCDynamic, TSimpleDynamic, TStdSimpleDynamic, TSCSimpleDynamic, and MDynamic). These used to be omitted, causing link errors unless the user provided their implementations.
Made LinkSharedLibrary exit with an error if the Link or PPCLink command fails. It used not abort, which caused builds to continue when the shouldn't have.
GetFunctionPointer() and GetIndexedFunctionPointer() now return a CDECLProcPtr instead of a ProcPtr. The CDECLProcPtr typedef is the same as ProcPtr when using PPCC, C, CFront, and SC. When using SCpp or MrC, it contains the _cdecl keyword, mainly to force C calling conventions when using SCpp.
Fixed a bug that showed up if an application did an _ExitToShell without first calling CleanupLibraryManager() and the ZAP DCMD was being used. ASLM's _ExitToShell patch calls CleanupLibraryManager() which then disposes the memory occupied by the patch. Before returning to the patch, the ZAP DCMD would have zapped it's code already and cause a crash. CleanupLibraryManager() will no longer free the memory occupied by the patch if it is being called by the patch. Instead it relies on the fact that the application's heap is about to be freed anyway so there is no need to free the patch's memory.
PowerPC: LibraryBuilderPPC will now define the __powerc macro.
68K: LibraryBuilder will now define the applec macro.
LibraryManager.h no longer defines the "powerpc" macro the macro is no longer used anywhere in the header files or sample code. Instead, the new GENERATINGPOWERPC and GENERATING68K macros are used.
Function sets and classes may now have both exports= and dontexport= clauses as long as they also have privateexports=*. This allows you to export some functions/methods publicly, explicity not export some, and have the rest exported privately.
LibraryBuilder will now produce an error message if you export a class method from a function set and the class is also exported and the method is not listed in the dontexport= clause.
Fixed some logfile support problems that caused either extra or missing warnings and error messages.
Fixed some logfile problems that turned up when using SCpp, MrC, and PPCC, that caused incorrect logfiles to be generated for any class containing pure virtual methods.
Fixed a problem with the logfile support that caused it to give an error message if you stopped overriding an inherited method.
============================
Changes for 2.0b4 - 8/25/94
Fixed the error message that LibraryBuilder gives if you have duplicate function set names.
68k: Fixed System 6 support. The INIT(19) resource was not getting locked down. This bug was introduced a couple of builds ago.
Fixed GetSharedResourceInfo() so you don't need to call EnterSystemMode() and Preflight() before calling it.
Fixed FINALLY macro. It used to not excute the code in the FINALLY section if an exception had been thrown.
PowerPC: Fixed code that cleans up a shared library when it unloads. Random crashes where happening after a shared library was reloaded.
Added kTHashListGrowerID to LibraryManagerClasses.h so you can call LoadClass() on it (which you need to do if you want to try growing a THashList at interrupt time).
Changed the TException declaration in LibraryManager.h to keep Metrowerks happy.
Fixed THashList::Grow(). It was causing the hash list size to double and was leaving interrupts disabled.
Fixed TDoubleLong::RShift() and LShift(). It was necessary to make them return a TDoubleLong& instead of a TDoubleLong and to actually modify the object rather than just returning a stack object with the result.
Fixed a TraceMonitor crash that ocurred if ASLM was not available.
PowerPC: Fixed a memory leak that caused CFM to eat up an 8k block after ASLM loaded and unloaded a shared library enough times.
PowerPC: Fixed a bug that caused ASLM to not fail gracefully if it could not prepare the fragment that a shared library is in.
Fixed CloseLibraryFile() so it doesn't return an error if the file is still preflighted unless the file is really about to be closed (it won't be closed if the usecount does not go to zero).
Added -useLibraryID and -symdir options to BuildSharedLibrary. -symdir is used to specify which directory to put the symfile in. It can be used with -symfile if the entire path name is not specified with -symfile. -useLibraryID is used to tell BuildSharedLibrary to use the shared librar's library id as the symfile name. You can use -symdir to specify which directory the symfile should go in. Commas and colons will be converted to underscores and .SYM or .xSYM will be concatentated to the file name.
====================
See the "Change History (old)" document for changes that ocurred before 2.0b2.